package cn.egame.extraction.util;

import java.io.*;

import org.apache.log4j.Logger;

import cn.egame.common.util.Utils;
import cn.egame.extraction.pojo.ProcessBean;

public class FileOperator {
    private static final Logger logger = Logger.getLogger("egameTimeSync");
   
    /** */
    /**
     * copyFile 复制源文件到目标文件 targetFile 复制的目标文件名 sourceFile 复制的源文件名
     * 复制文件是否成功，true表示成功，false表示不成功 如果源文件名是一个目录且目标文件名不存在，则创建它
     * 如果源文件名是一个目录且目标文件名存在，则忽略 如果源文件名是一个文件且目标文件名不存在，则创建它 如果源文件名是一个文件且比目标文件新，则覆盖它
     * 如果源文件名是一个文件且比目标文件旧，则忽略
     *
     */
    public static boolean copyFile(File targetFile, File sourceFile) {

        // 如果源文件名是一个目录且目标文件名不存在，则创建它
        if (sourceFile.isDirectory() && !targetFile.exists()) {
            logger.info("目录且不存在:" + targetFile.toString());
            targetFile.mkdirs();
            return true;
        }

        // 如果源文件名是一个目录且目标文件名存在，则忽略
        if (sourceFile.isDirectory() && targetFile.exists()) {
            logger.info("目录且存在:" + targetFile.toString());
            return true;
        }

        // 如果源文件名是一个文件且目标文件名不存在，则创建它
        if (sourceFile.isFile() && !targetFile.exists()) {
            String parentPath = targetFile.getParent();
            File parentFile = new File(parentPath);
            parentFile.mkdirs();
            logger.info("文件且文件不存在:" + targetFile.toString());
            return writer(targetFile, sourceFile);
        }
        // 如果源文件名是一个文件且比目标文件新，则覆盖它
        if (sourceFile.isFile() && sourceFile.lastModified() > targetFile.lastModified()) {
            logger.info("文件且文件存在且要修改:" + targetFile.toString());
            return writer(targetFile, sourceFile);

        }

        // 如果源文件名是一个文件且比目标文件旧，则忽略
        if (sourceFile.isFile() && sourceFile.lastModified() <= targetFile.lastModified()) {
            logger.info("文件且文件存在:" + targetFile.toString());
            return true;

        }
        // 如果前五种条件都不符合，则表示无法复制文件，返回false
        return false;
    }

    /** */
    /**
     * copyFile 复制源文件到目标文件 targetFilePath 复制的目标文件路径 sourceFilePath 复制的源文件路径
     * 复制文件是否成功，true表示成功，false表示不成功 如果源文件名是一个目录且目标文件名不存在，则创建它
     * 如果源文件名是一个目录且目标文件名存在，则忽略 如果源文件名是一个文件且目标文件名不存在，则创建它 如果源文件名是一个文件且比目标文件新，则覆盖它
     * 如果源文件名是一个文件且比目标文件旧，则忽略
     */
    public static boolean copyFile(String targetFilePath, String sourceFilePath) {
        return copyFile(new File(targetFilePath), new File(sourceFilePath));
    }

    /** */
    /**
     * deleteFile 删除目标文件 targetFile 将被删除的文件 true表示删除成功，false表示不成功
     */
    public static boolean deleteFile(File targetFile) {
        return targetFile.delete();
    }

    /** */
    /**
     * deleteFile 删除目标文件 targetFilePath 将被删除的文件路径 true表示删除成功，false表示不成功
     */
    public static boolean deleteFile(String targetFilePath) {
        return deleteFile(new File(targetFilePath));
    }

    // 使用io对文件进行读写
    private static boolean writer(File targetFile, File sourceFile) {
        FileInputStream br = null;
        FileOutputStream bw = null;
        try {
            br = new FileInputStream(sourceFile);
            bw = new FileOutputStream(targetFile);
            byte[] fileContent = new byte[1024];
            int readed = 0;
            int readSum = 0;

            while ((readed = br.read(fileContent)) != -1) {
                readSum += readed;
                bw.write(fileContent, 0, readed);
            }

            bw.close();
            br.close();

            return true;
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            return false;
        } finally {

            if (null != br) {

                try {
                    br.close();
                } catch (IOException e) {

                    logger.error(e.getMessage(), e);
                }
            }
            if (null != bw) {

                try {
                    bw.close();
                } catch (IOException e) {

                    logger.error(e.getMessage(), e);
                }
            }
        }
    }

    /** */
    /**
     * writeFileIndex 将需要搜索的整个文件目录树写入指定的文件中 filePath 需要搜索的文件根目录 filename
     * 指定的写入文件名 无
     */
    public static boolean writeFileIndex(ProcessBean bean, String filename) {
        boolean flag = false;
        PrintWriter pw = null;
        try {
            File file = new File(ConstVar_EFS.INIT_FILE_PATH);
            if (!file.exists()) {

                file.mkdirs();
            }
            // 创建索引文件
            pw = new PrintWriter(new BufferedWriter(new FileWriter(new File(file, filename), true)));
            String[] temp = new File(bean.getSource()).list();
            if (null != temp && temp.length != 0) {
                for (int j = 0; j < temp.length; j++) {
                    File newFile = new File(bean.getSource() + File.separator + temp[j]);
                    if (newFile.isFile()) {
                        long time_step = System.currentTimeMillis() - newFile.lastModified();
                        // 同步当前时间戳超过10分钟的文件
                        if (time_step > ConstVar_EFS.TIME_STEP) {
                            pw.println(newFile.getAbsolutePath()+","+bean.getTarget());
                        }
                        flag = true;
                    } else {
                        flag = writeFileIndex(new ProcessBean(bean.getSource() + File.separator + temp[j],bean.getTarget()), filename);
                    }

                }
                pw.flush();
                pw.close();

            }

        } catch (IOException e) {
            logger.error(e.getMessage(), e);
        }

        return flag;
    }

    /** */
    /**
     * synFile 同步文件 sourcePath 源文件根目录 targetPath 目标文件根目录 filename 源文件目录树
     * 循环读取源文件，然后写入目标文件对应位置
     */
    public static boolean synFile(String targetPath, String sourcePath, String filename) {
        boolean flag = false;
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader(new File(ConstVar_EFS.INIT_FILE_PATH, filename)));
            String file;

            while ((file = br.readLine()) != null) {
                file =file.substring(0,file.indexOf(","));
                // 读取源文件索引列表
                File sourceFile = new File(file);
                logger.info("源：" + file);
                file = file.replace(sourcePath, targetPath);// 换转为目标文件名
                logger.info("目标：" + file);
                File targetFile = new File(file);// 得到目标文件
                long start = System.currentTimeMillis();
                flag = copyFile(targetFile, sourceFile);
                long end = System.currentTimeMillis();
                logger.info("target file " + file + " process spend time: " + (end - start) / 1000.0 + "s");
            }
            br.close();
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            flag = false;
        } finally {

            if (null != br) {
                try {
                    br.close();
                } catch (IOException e) {
                    logger.error(e.getMessage(), e);
                }

            }
        }
        return flag;
    }
}
